package cc.linker.steplink.crm.merchanth5.dao.acs;

import cc.linker.steplink.crm.merchanth5.pojo.MerchantOrderGoodsPo;
import cc.linker.steplink.crm.merchanth5.pojo.MerchantOrderPo;
import cc.linker.steplink.crm.merchanth5.pojo.acs.GoodsParamPo;
import cc.linker.steplink.crm.merchanth5.pojo.acs.TradeInfo;
import cc.linker.steplink.crm.merchanth5.pojo.coupon.CouponGoodsPo;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.Map;

@Component
public interface PurchaseProcessDao {
    /**
     * 插入订单
     *
     * @param map
     */
    void insertOrderByMap(Map<String, Object> map);

    /**
     * 插入订单商品
     *
     * @param map
     */
    void insertOrderGoodsByMap(Map<String, Object> map);

    /**
     * 批量插入订单商品
     *
     * @param
     */
    //void insertOrderGoodsByMapBatch(Map<String, Object> map);

    void insertOrderGoodsByPoBatch(MerchantOrderGoodsPo goods);

    /**
     * 通过订单sn查订单详情
     *
     * @param orderSn
     * @return
     */
    List<MerchantOrderPo> getMerchantOrderByPayTradeId(String orderSn);

    /**
     * 更新订单商品状态
     *
     * @param map
     */
    void updateMerchantOrderGoodsInfo(@Param("status") Integer status, @Param("orderId") Integer orderId);

    /**
     * 通过订单sn拿订单id
     *
     * @param orderSn
     * @return
     */
    Integer getOrderIdByOrderSn(@Param("orderSn") String orderSn);

    /**
     * 获取用户积分
     *
     * @param customerId
     * @return
     */
    Integer getScoreByCustomerId(String customerId);

    /**
     * 获取机构的总平台费
     *
     * @param orgId
     * @return
     */
    Map<String, String> getPlatformRateByOrgId(String orgId);

    /**
     * 通过商品id获取返利
     *
     * @param goodsId
     * @return
     */
    Integer getRebateByGoodsId(Long goodsId);

    /**
     * 通过商品id获取推广返利
     *
     * @param goodsId
     * @return
     */
    Integer getPromotionRebateByGoodsId(Long goodsId);

    /**
     * 通过商品id拿商品名称
     *
     * @param goodsId
     * @return
     */
    String getGoodsNameByGoodsId(String goodsId);

    /**
     * 通过cid查openid
     *
     * @param customerId
     * @return
     */
    String getOpenIdByCustomerId(String customerId);

    /**
     * 通过cid查懂小姐openid
     *
     * @param customerId
     * @return
     */
    String getMissOpenIdByCustomerId(String customerId);

    /**
     * 通过商品id查归属Id
     *
     * @param goodsId
     * @return
     */
    String getBelongIdByGoodsId(Long goodsId);

    /**
     * 通过用户id查银行卡号
     *
     * @param customerId
     * @return
     */
    String getCustomerAccountNumberByCustomerId(String customerId);

    /**
     * 获取联汇id
     *
     * @return
     */
    String getLinkId();

    /**
     * 通过cid找上级id
     *
     * @param customerId
     * @return
     */
    String getPidByCid(String customerId);

    /**
     * 通过用户id查用户角色 3-小b 2-推广员 1-加盟代理 0-普通用户
     *
     * @param customerId
     */
    Integer getUserRoleByCustomerId(String customerId);

    /**
     * 通过订单sn获取商品名称（可能为多个，逗号拼接）
     *
     * @param orderSn
     * @return
     */
    String getGoodsNamesByOrderSn(String orderSn);

    /**
     * 通过订单id查找商品信息
     *
     * @param orderId
     * @return
     */
    List<MerchantOrderGoodsPo> getOrderGoodsListByOrderId(Long orderId);

    /**
     * 插入交易记录
     *
     * @param map
     */
    void insertTradeInfo(Map<String, Object> map);

    /**
     * 插入懂小姐交易记录
     *
     * @param map
     */
    void insertDongTradeInfo(Map<String, Object> map);

    /**
     * 插入积分记录
     *
     * @param map
     */
    void insertTradeScoreInfo(Map<String, Object> map);

    /**
     * 根据用户id查余额(customer表)
     *
     * @param customerId
     * @return
     */
    Integer getUserBalanceByCustomerId(String customerId);

    /**
     * 根据机构id查余额(org表)
     *
     * @param orgId
     * @return
     */
    Integer getOrgBalanceByOrgId(String orgId);

    /**
     * 根据用户id查小b余额(saler表)
     *
     * @param customerId
     * @return
     */
    Integer getSalesBalanceByCustomerId(String customerId);

    /**
     * 根据orgId查机构冻结时间
     *
     * @param orgId
     * @return
     */
    Integer getFreezeTimeByOrgId(String orgId);

    /**
     * 更新大b余额
     *
     * @param tradeInfo
     */
    void updateOrgAccountFreeze(TradeInfo tradeInfo);

    void reduceOrgAccountFreeze(TradeInfo tradeInfo);

    void saveOrgAccountFreeze(Map param);

    void updateOrgAccountBalance(TradeInfo tradeInfo);

    /**
     * 更新小b余额
     *
     * @param tradeInfo
     */
    void updateSalesAccountFreeze(TradeInfo tradeInfo);

    void reduceSalesAccountFreeze(TradeInfo tradeInfo);

    /**
     * 更新用户余额
     *
     * @param tradeInfo
     */
    void updateCustomerAccountFreeze(TradeInfo tradeInfo);

    /**
     * 更新推广员余额
     *
     * @param tradeInfo
     */
    void updateAgentAccountFreeze(TradeInfo tradeInfo);

    /**
     * 根据订单sn获取机构Id
     *
     * @param orderSn
     * @return
     */
    String getOrgIdByOrderSn(String orderSn);

    /**
     * 根据订单sn获取用户id
     *
     * @param orderSn
     * @return
     */
    String getCustomerIdByOrderSn(String orderSn);

    /**
     * 给用户扣积分
     *
     * @param scoreUse
     * @return
     */
    int updateScoreByCustomerId(@Param("scoreUse") Long scoreUse, @Param("customerId") String customerId);

    /**
     * 回滚金币
     * @param scoreUse
     * @param customerId
     * @return
     */
    int rollbackScoreByCustomerId(@Param("scoreUse") Long scoreUse, @Param("customerId") String customerId);

    /**
     * 给用户加积分
     *
     * @param scoreUse
     * @param customerId
     * @return
     */
    void addScoreByCustomerId(@Param("scoreUse") Long scoreUse, @Param("customerId") String customerId);

    /**
     * 根据id查用户积分余额
     *
     * @param customerId
     * @return
     */
    Integer getCustomerScoreBalanceByCustomerId(String customerId);

    /**
     * 更新sku库存
     *
     * @param map
     * @return
     */
    int updateGoodsSkuCount(Map<String, Object> map);

    int addGoodsSkuCount(Map<String, Object> map);

    /**
     * 根据orderSn判断trade表是否已经记录
     *
     * @param orderSn
     * @return
     */
    Integer countTradeByOrderSn(String orderSn);

    /**
     * 根据paySn判断trade表是否已经记录
     *
     * @param paySn
     * @return
     */
    Integer countTradeByPaySn(String paySn);

    /**
     * 给订单加所花积分
     *
     * @param orderSn
     * @param scoreUse
     */
    void updateOrderScore(@Param("orderSn") String orderSn, @Param("score") Long scoreUse);

    /**
     * 根据orderSn判断订单类别，2-提现1-商品0-没有
     *
     * @param param
     * @return
     */
    Integer checkOrderTypeByOrderSn(Map<String, Object> param);

    /**
     * 根据paySn判断订单类别，2-提现1-商品0-没有
     *
     * @param param
     * @return
     */
    Integer checkOrderTypeByPySn(Map<String, Object> param);

    /**
     * 根据订单sn查订单信息customerId、orgId、goodsName、goodsId
     *
     * @param orderSn
     * @return
     */
    Map<String, Object> getOrderInfoByOrderSn(String orderSn);

    /**
     * 根据订单paysn查订单信息customerId、orgId、goodsName、goodsId
     *
     * @param paySn
     * @return
     */
    List<Map<String, Object>> getOrderListByPaySn(String paySn);

    /**
     * 根据订单paysn查订单信息customerId、orgId、goodsName、goodsId
     *
     * @param paySn
     * @return
     */
    List<Map<String, Object>> getOrderInfoByPaySn(String paySn);

    /**
     * 根据机构和费用类型查询分账配置账号
     *
     * @param orgId
     * @param type  见FeeConstants
     * @return
     */
    String getAccountByFeeTypeAndOrdId(@Param("type") String type, @Param("orgId") String orgId);

    /**
     * 新增默认配置
     *
     * @param orgId
     */
    void insertAcsOrgDefaultConfig(String orgId);

    /**
     * @Description: 更新提现状态
     * @Param:
     * @Return:
     * @Author: 锋
     * @Date: 2019/10/11 18:03
     * @Version:
     */
    void updateWithdrawStatus(Map<String, Object> param);

    /**
     * @param param
     */
    void updateWithdrawTradeInfo(Map<String, Object> param);

    /**
     * @param orderSn
     * @return
     */
    Map<String, Object> getWithdrawTradeInfo(String orderSn);

    /**
     * @param withdrawInfo
     */
    void insertWithdrawFailTradeInfo(Map<String, Object> withdrawInfo);

    /**
     * 通过费用类型，获得账户类型
     *
     * @param type  FeeConstants
     * @param orgId 机构id
     * @return
     */
    String getAccountTypeByFeeTypeAndOrgId(@Param("type") String type, @Param("orgId") String orgId);

    /**
     * 获取小B余额
     *
     * @param params
     * @return
     */
    Map<String, Object> getXbAccountInfo(Map<String, Object> params);

    Map<String, Object> getCustomerAccountInfo(Map<String, Object> withdrawInfo);

    Map<String, Object> getOrgAccountInfo(Map<String, Object> withdrawInfo);

    void updateOrgAccountbalance(Map<String, Object> withdrawInfo);

    void updateXbAccountbalance(Map<String, Object> withdrawInfo);

    void updateCustomerAccountbalance(Map<String, Object> withdrawInfo);

    /**
     * 根据用户openid+token查customerId
     */
    String getCustomerIdByTokenAndOpenid(Map<String, Object> param);

    /**
     * 根据orderSn查商品id和购买数量
     */
    List<Map<String, Object>> getGoodsIdAndBuyNumByOrderSn(String orderSn);

    /**
     * 查用户角色a-小b b-推广员 c-加盟代理
     */
    Map<String, Long> getUserRoleMapByCustomerId(String customerId);

    String getTokenByOrgId(String orgId);

    String getPromotionStrRebateByGoodsId(Long id);

    /**
     * 获取企业资质信息
     */
    String getOrgMerchantInfoByOrgId(String orgId);

    /**
     * 根据行业代码获取行业名称
     */
    String getIndustryNameByCode(String industryCode);

    /**
     * 通过机构id获取appId
     */
    String getAppIdByOrgId(String orgId);

    /**
     * 通过机构id获取该机构的联会子账户
     */
    String getLinkIdByOrgId(String orgId);

    /**
     * 通过机构id获取该机构的联会子账户
     */
    String getLinkIdByLinkOrg(String orgId);

    /**
     * 通过customerId查账号关联的uuid
     */
    String getAccountUidByCustomerId(String customerId);

    /**
     * 通过orgId查账号关联的uuid
     */
    String getAccountUidByOrgId(String orgId);

    /**
     * 更新订单实付金额
     */
    void updateOrderAmountByOrderSn(@Param("orderSn") String orderSn, @Param("pay") int pay);

    /**
     * 列出机构下绑定了手机号的用户，且openid不为空
     */
    List<Map<String, Object>> listCustomerWhereHaveBindPhoneByOrgId(String orgId);

    /**
     * 根据cid查cname
     */
    String getCustomerNameByCustomerId(String customerId);

    /**
     * 获取商品详情
     */
    Map<String, Object> getGoodsInfoByGoodsId(String goodsId);

    /**
     * 更新订单状态
     */
    void updateOrderInfo(@Param("wxtransactionId") String wxtransactionId,@Param("paymentState") Integer paymentState,
                         @Param("orderState") Integer orderState,@Param("orderSn") String orderSn);

    /**
     * 知识付费更新订单商品
     */
    void updateKnowledgeOrderGoodsInfo(Map<String, String> updateOrderMap);

    /**
     * 通过内容的goodsId查专栏的goodsId
     */
    String getColumnGoodsIdByContentGoodsId(String goodsId);

    /**
     * 通过商品id获取商品类型
     */
    Integer getGoodsTypeByGoodsId(String goodsId);

    /**
     * 通过机构id获取提醒手机号
     */
    String getRemindPhoneByOrgId(String orgId);

    /**
     * 通过用户id获取提醒手机号
     */
    String getRemindPhoneByBelongIdList(List<String> belongIdList);

    /**
     * 保存通联请求参数
     */
    void saveTlPayReqParam(@Param("orderSn") String orderSn, @Param("reqParams") String reqParams, @Param("linkerTake") String linkerTake, @Param("unionBarleyTake") String unionBarleyTake);

    /**
     * 插入维权交易账单
     */
    void insertProtectTradeInfo(Map<String, Object> map);

    /**
     * 插入懂小姐维权交易账单
     */
    void insertDongProtectTradeInfo(Map<String, Object> map);

    /**
     * 获取短信plantName配置列表
     */
    List<String> getSmsTokenList();

    /**
     * 获取回调次数
     *
     * @param refundOrderSn
     * @return
     */
    Map getRefundNum(String refundOrderSn);

    /**
     * 修改回调次数
     *
     * @param refundOrderSn
     * @return
     */
    void updateRefundNum(String refundOrderSn);

    /**
     * 更新结束时间
     */
    void updateProtectStatusWhereAutoConfirm(@Param("orderSn") String orderSn, @Param("unFreezeTime") String unFreezeTime);

    /**
     * 判断订单是否在退款中
     *
     * @return 大于0-有，等于0-无
     */
    Integer judgeOrderIfInRefundByOrderSn(String orderSn);

    /**
     * 通过报名id获取报名名称
     */
    String getEnrollNameByEnrollId(String enrollId);

    /**
     * 判断用户是否买过某个商品
     *
     * @param customerId
     * @param goodsId
     * @return
     */
    Integer countGoodsByCustomerIdAndGoodsId(@Param("customerId") String customerId, @Param("goodsId") String goodsId);

    /**
     * 插入赠品记录
     *
     * @param map
     */
    void insertExerciseRecord(Map<String, Object> map);

    /**
     * 增加赠品已发放数量
     *
     * @param id
     * @return
     */
    int addExerciseById(Integer id);

    /**
     * 若发放完，更改状态
     *
     * @param id
     */
    void changeExerciseStateById(Integer id);

    /**
     * 通过机构号查平台营销账号
     *
     * @param orgId
     * @return
     */
    String getMarketAccountByOrgId(String orgId);

    /**
     * 插入加盟代理订单表
     *
     * @param orderSn
     */
    void insertPromoterOrder(@Param("orderSn") String orderSn, @Param("type") Integer type);

    /**
     * 根据订单sn查recId
     *
     * @param orderSn
     * @return
     */
    List<Map<String, Object>> getRecIdByOrderSn(String orderSn);

    /**
     * 通过订单id恢复赠品
     *
     * @param orderId
     */
    void recoveryExerciseByOrderId(Long orderId);

    /**
     * 通过订单id删除赠品记录
     *
     * @param orderId
     */
    void deleteExerciseRecordByOrderId(Long orderId);

    /**
     * 更新赠品记录为已完成
     *
     * @param map
     */
    void updateExerciseRecordByRecId(Map<String, Object> map);

    /**
     * 判断赠品中是否有懂小姐体检券
     *
     * @param map
     * @return
     */
    Integer countDongExerciseRecordByRecId(Map<String, Object> map);

    /**
     * 通过订单sn查活动的机构id
     *
     * @param sn
     * @return
     */
    String getOrgIdByEnrollOrderSn(String sn);

    List<Map> getMerchantByCartIds(String shoppingCartIds);

    String getXcxAppIdByOrgId(String orgId);

    int getAppCustomerByCid(String customerId);

    String getOrgIdByToken(Map<String, Object> param);

    String getCustomerIdByOrgIdAndOpenid(Map<String, Object> param);

    Integer getPromotionByGoodsId(Long id);

    String getOrgIdByPaySn(String sn);

    void updatePaySn(@Param("paySn") String paySn);

    /**
     * 插入商品维权交易账单
     */
    void insertGoodsProtectTradeInfo(Map<String, Object> map);

    String getPaySnByOrderSn(@Param("sn") String sn);

    Integer getProtectGoodsCount(@Param("sn") String sn);

    List<Map<String, Object>> getTlParamList(@Param("orderSn") String orderSn);

    List<Map<String, Object>> getTlParamListByRecId(@Param("recId") Long recId);

    String getRefundOrderSn(@Param("refundOrderSn") String refundOrderSn);

    Integer getOrderAmountByPaySn(@Param("paySn") String paySn);

    Map<String, Object> getOrderPayStatus(@Param("orderSn") String orderSn);

    String getOrderSource(@Param("paySn") String paySn);

    void updatePaySnPayOld(@Param("paySn") String paySn,@Param("oldPaySn") String oldPaySn,@Param("orderSource") String orderSource);

    String getWithDrawIdByOrderSn(Map<String, Object> param);

    void addPurchaseOrder(Map<String, Object> map);

    Map<String, Object> getAddressDetail(@Param("addressId") Integer addressId);

    Map<String, Object> getTemplateDetail(Map<String, Object> addDetail);

    Long getMallsGoodsIdByGoodsId(@Param("id") Long id);

    String getOrgIdByGoodsId(@Param("goodsId") Long goodsId);

    Integer getMallsGoodsPriceByGoodsId(@Param("goodsId") Long goodsId,@Param("skuId") Long skuId);

    void addRefundLogs(Map<String, Object> temps);

    Map<String, Object> getOpenOrderPayStatus(@Param("orderSn") String orderSn);

    Long getMallsSkuIdBySkuId(@Param("skuId") Long skuId);

    void saveOrderScore(@Param("orderSn") String orderSn, @Param("oscore") int oscore);

    void saveOrderGoodsScore(@Param("recId") Long recId, @Param("paymentPoints") Integer paymentPoints);

    Map<String,Object> getCustomerInfoByCustomerId(@Param("customerId") String customerId);

    GoodsParamPo getAllByGoodsId(Long id);

    Map<String, String> getPlatformRateByOrgId2(String mallsOrgId);

    void addMallGoodsSkuCount(Map<String, Object> map);

    void updateLossOrder(@Param("isLoss") Integer isLoss,@Param("mallsLossAmount")  int mallsLossAmount,@Param("salerLossAmount")  int salerLossAmount,@Param("orderSn")  String orderSn,@Param("lossOrgId") String lossOrgId,@Param("lossSalerOrgId") String lossSalerOrgId);

    Integer getRefundLogsCount(Map<String, Object> temps);

    void addScoreLog(Map<String, Object> scoreLog);

    void addScoreLogTask(Map<String, Object> scoreLog);

    String getOrgIdByVipOrderSn(@Param("orderSn") String orderSn);

    CouponGoodsPo getCouponGoods(@Param("couponId") String couponId);

    String getOrgIdByFormOrderSn(@Param("orderSn") String orderSn);

    Integer getVipOrderPayStatus(@Param("orderSn") String orderSn);
}
